package web.java.g_Text;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

import web.java.z_JDBCUtil.DBUtil;

public class Demo01_Text {
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet result;
	/**
	 * jdbc操作长文本数据，包括图片，视频，音频
	 * 通过FileReader输入流将文本写入到数据库
	 * @throws IOException 
	 * */
	public void save() throws IOException {
		//找到文件路径
		String txtPath=Demo01_Text.class.getResource("tips.txt").getPath();
		FileReader txtBuf=new FileReader(new File(txtPath));
		conn=DBUtil.connection();
		String sql="insert into text(content) values(?)";
		try{
			pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
			//将输入字符流的文本写入到数据库
			pstmt.setCharacterStream(1,txtBuf);
			pstmt.executeUpdate();
			result=pstmt.getGeneratedKeys();
			if(result.next()){
				System.out.println(result.getInt(1));
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			DBUtil.closeConn(conn, pstmt, result);
		}
	}
	/**
	 * 从数据库取文件
	 * @throws IOException 
	 * */
	@Test
	public void fetchFile() throws IOException{
		//读取数据库
		conn=DBUtil.connection();
		String sql="select content from text";
		try{
			pstmt=conn.prepareStatement(sql);
			result=pstmt.executeQuery();
			if(result.next()){
				//直接读取
				//System.out.println(result.getString("content"));
				//通过字符流读取
				Reader in=result.getCharacterStream("content");
				int length;
				while((length=in.read())!=-1){
					System.out.print((char)length);
				}
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			DBUtil.closeConn(conn, pstmt, result);
		}
	}
	/**
	 * 通过InputStream输入流把图片存入数据库
	 * */
	@Test
	public void saveImg(){
		//1、获取图片输入流
		InputStream in=Demo01_Text.class.getResourceAsStream("7.jpg");
		//2、连接数据库
		conn=DBUtil.connection();
		String sql="insert into text(img) values(?)";
		try{
			//3、预编译SQL语句
			pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
			//4、使用pstmt.setBinaryStream(int index, InputStream in); 将输入流中的图片资源写入到数据库
			pstmt.setBinaryStream(1, in);
			//5、执行SQL语句，注意：这里使用的是pstmt.execute();
			pstmt.execute();
			//6、execute也可以接收到自增长的值
			result=pstmt.getGeneratedKeys();
			if(result.next()){
				System.out.println(result.getInt(1));
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			//7、关闭数据库
			DBUtil.closeConn(conn, pstmt, result);
		}
	}
	/**
	 * 从数据库中取出图片资源，并写入到本地磁盘
	 * */
	@Test
	public void fetchImg(){
		//1、连接数据库
		conn=DBUtil.connection();
		//2、写出查询图片资源的SQL语句
		String sql="select img from text where id=2";
		InputStream in=null;
		FileOutputStream writer=null;
		try{
			//3、预编译sql指令
			pstmt=conn.prepareStatement(sql);
			//4、执行sql语句，并返回结果集
			result=pstmt.executeQuery();
			//5、此时结果集里就一个文件，用if语句即可
			if(result.next()){
				//输出的是一个InputStream类对象，用InputStream去接收
				in=result.getBinaryStream(1);
				//6、创建文件输出流
				writer=new FileOutputStream("e:/1.jpg");
				byte[] buf=new byte[1024];
				int length;
				while((length=in.read(buf))!=-1){
					writer.write(buf,0,length);
				}
			}
		}catch(SQLException e){
			e.printStackTrace();
		}catch(IOException ie){
			ie.printStackTrace();
		}finally{
			//关闭输入输出流
			if(writer!=null){
				try {
					writer.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(in!=null){
					try {
						in.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
			//关闭数据库
			DBUtil.closeConn(conn, pstmt, result);
		}
	}
}
